package cn.itcast.netty.c3;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;
import lombok.extern.slf4j.Slf4j;
import sun.rmi.runtime.Log;

import java.net.InetSocketAddress;
import java.util.concurrent.TimeUnit;

@Slf4j
public class EventLoopClient {
    public static void main(String[] args) throws InterruptedException {
        // 带有Future,Promise的类型 都是和异步方法配套使用
        ChannelFuture channelFuture = new Bootstrap()
            // NioEventLoopGroup
            .group(new NioEventLoopGroup())
            // 选择客户端 channel 实现
            .channel(NioSocketChannel.class)
            // 添加处理器
            .handler(new ChannelInitializer<NioSocketChannel>() {
                @Override   //连接建立后被调用
                protected void initChannel(NioSocketChannel ch) throws Exception {
                    ch.pipeline().addLast(new StringEncoder());
                }
            })
            // 连接服务器 connect是一个异步非阻塞方法
            .connect(new InetSocketAddress("localhost", 8080));
        // 阻塞方法 直到连接建立才会继续运行下面
        //方法1 使用sync方法来同步处理结果
//        channelFuture.sync(); // 阻塞当前线程 知道 nio线程连接建立完毕
//        //连接对象
//        Channel channel = channelFuture.channel();
//        channel.writeAndFlush("hhhh");
//        System.out.println(channel);
//        System.out.println("");

        //方法2 使用addListener 方法异步处理结果
        channelFuture.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                Channel channel = future.channel();
                log.debug("{}",channel);
                channel.writeAndFlush("hhhh");
            }
        });


    }
}
